//package com.diaohaiwen.module.metadata.service.execute;
//
//import cn.hutool.core.convert.Convert;
//import cn.hutool.core.util.ObjUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.diaohaiwen.module.metadata.enums.ItemTypeEnums;
//import com.diaohaiwen.platform.remote.metadata.obj.bo.ParamBO;
//import com.diaohaiwen.platform.remote.metadata.obj.bo.TableColumnBo;
//import com.diaohaiwen.platform.remote.metadata.obj.bo.TableParamBO;
//import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.stream.Collectors;
//
//@Slf4j
//@Service
//public class ParamDetailExecute extends ServiceImpl<TableParamMapper, TableParamDO> implements BaseExecute<TableParamDO> {
//
//
//    @Resource
//    private DynamicTableMapper dynamicTableMapper;
//    @Resource
//    private TableColumnMapper tableColumnMapper;
//
//    public List<TableParamBO> execute(String sourceId) {
//        List<TableParamDO> rows = findParams(sourceId);
//        Set<String> tableIds = rows.stream().map(TableParamDO::getTableId).collect(Collectors.toSet());
//        List<DynamicTableDO> attributeList = findAttribute(tableIds);
//        Map<String, List<TableColumnDO>> itemMap = findItem(tableIds).stream().collect(Collectors.groupingBy(TableColumnDO::getTableId));
//        Map<String, List<TableParamDO>> paramMap = rows.stream().collect(Collectors.groupingBy(TableParamDO::getTableId));
//
//        return attributeList.stream().map(attribute -> {
//            List<TableColumnDO> items = itemMap.get(attribute.getId());
//            List<TableParamDO> params = paramMap.get(attribute.getId());
//            return convert(attribute, items, params);
//        }).toList();
//    }
//
//    /**
//     * 参数转换
//     *
//     * @param attribute 自定义属性
//     * @param items     自定义属性
//     * @param params    参数值 DYNAMIC_TABLE
//     */
//    private TableParamBO convert(DynamicTableDO attribute, List<TableColumnDO> items, List<TableParamDO> params) {
//        TableParamBO record = DynamicTableConvert.INSTANCE.entityToBo(attribute);
//        ParamBO param = convertParam(attribute.getId(), record.getColumns(), params);
//        record.setColumns(TableColumnConvert.INSTANCE.entityToBo(items));
//        record.setParams(param);
//        return record;
//    }
//
//    /**
//     * 参数值 行转列
//     *
//     * @param attributeId 属性ID
//     * @param items       列
//     * @param params      参数
//     */
//    private ParamBO convertParam(String attributeId, List<TableColumnBo> items, List<TableParamDO> params) {
//        ParamBO param = new ParamBO();
//        param.setMultiple(Boolean.FALSE);
//
//        ParamBO record = new ParamBO();
//        record.setAttributeId(attributeId);
//        Map<Integer, List<TableParamDO>> group = params.stream().collect(Collectors.groupingBy(TableParamDO::getSort));
//
//        if (group.size() == 1) {
//            record.setMultiple(Boolean.FALSE);
//            Map<String, Object> map = rowToCell(items, params);
//            record.setValue(map);
//            return record;
//        }
//
//        List<Map<String, Object>> list = group.keySet().stream().sorted(Integer::compareTo)
//                .map(group::get)
//                .map(v -> rowToCell(items, v))
//                .toList();
//        record.setMultiple(Boolean.TRUE);
//        record.setValues(list);
//
//        return record;
//    }
//
//
//    /**
//     * 查询所有参数
//     */
//    private List<TableParamDO> findParams(String sourceId) {
//        LambdaQueryWrapper<TableParamDO> wrappers = Wrappers.lambdaQuery();
//        wrappers.eq(TableParamDO::getSourceId, sourceId)
//                .select(TableParamDO::getTableId,
//                        TableParamDO::getColumnId,
//                        TableParamDO::getSort,
//                        TableParamDO::getVal
//                );
//        return this.list(wrappers);
//    }
//
//    private List<DynamicTableDO> findAttribute(Set<String> tableIds) {
//        return dynamicTableMapper.selectBatchIds(tableIds);
//    }
//
//    private List<TableColumnDO> findItem(Set<String> attributeIds) {
//        LambdaQueryWrapper<TableColumnDO> wrapper = Wrappers.lambdaQuery();
//        wrapper.in(TableColumnDO::getTableId, attributeIds);
//        wrapper.select(TableColumnDO::getTableId,
//                TableColumnDO::getColumnName,
//                TableColumnDO::getColumnCode,
//                TableColumnDO::getColumnType,
//                TableColumnDO::getUnit,
//                TableColumnDO::getMultiple,
//                TableColumnDO::getId,
//                TableColumnDO::getDefaultValue,
//                TableColumnDO::getRequired);
//        return tableColumnMapper.selectList(wrapper);
//    }
//
//
//    /**
//     * 行转列
//     */
//    private Map<String, Object> rowToCell(List<TableColumnBo> items, List<TableParamDO> params) {
//        Map<String, Object> map = new HashMap<>();
//        Map<String, List<TableParamDO>> paramMap = params.stream().collect(Collectors.groupingBy(TableParamDO::getColumnId));
//
//        items.forEach(item -> {
//            if (!paramMap.containsKey(item.getId())) {
//                return;
//            }
//
//            List<TableParamDO> list = paramMap.get(item.getId());
//
//            List<Object> objects = list.stream().map(l -> convert(l.getVal(), item.getColumnType())).filter(ObjUtil::isNotNull).toList();
//
//            if (Boolean.TRUE.equals(item.getMultiple())) {
//                map.put(item.getId(), objects);
//            }
//            Object val = objects.stream().findFirst().orElse(item.getDefaultValue());
//
//            if (ObjUtil.isNull(val)) {
//                return;
//            }
//            map.put(item.getColumnCode(), val);
//
//        });
//
//        return map;
//    }
//
//    /**
//     * 类型转换
//     */
//    private Object convert(String value, String type) {
//        if (StrUtil.isBlank(value)) {
//            return null;
//        }
//        ItemTypeEnums enums = ItemTypeEnums.parse(type);
//        return switch (enums) {
//            case INTEGER -> Integer.parseInt(value);
//            case FLOAT -> Double.parseDouble(value);
//            case BOOLEAN -> Boolean.parseBoolean(value);
//            case DATE -> Convert.toLocalDateTime(value).toLocalDate();
//            case DATETIME -> Convert.toLocalDateTime(value);
//            case TIME -> Convert.toLocalDateTime(value).toLocalTime();
//            default -> value;
//        };
//    }
//
//}
